/**
 * @file storage_manager.h
 * @brief 存储管理器
 * @details 管理文件的物理存储，包括上传、下载、去重等功能
 */

#pragma once

#include <string>
#include <memory>
#include <mutex>
#include "database_manager.h"

/**
 * @struct UploadResult
 * @brief 文件上传结果
 */
struct UploadResult {
    bool success;           ///< 上传是否成功
    std::string file_id;    ///< 生成的文件ID
    std::string hash;       ///< 文件哈希值
    uint64_t filesize;      ///< 文件大小
    bool is_duplicate;      ///< 是否为重复文件
    std::string error_msg;  ///< 错误信息
};

/**
 * @class StorageManager
 * @brief 存储管理器类
 * @details 单例模式的文件存储管理器，提供文件的存储、检索和管理功能
 */
class StorageManager 
{
public:
    /**
     * @brief 获取单例实例
     * @return StorageManager& 存储管理器实例
     */
    static StorageManager& getInstance();
    
    /**
     * @brief 初始化存储管理器
     * @return bool 初始化是否成功
     */
    bool init();
    
    /**
     * @brief 清理资源
     */
    void cleanup();
    
    /**
     * @brief 保存上传的文件
     * @param temp_file_path 临时文件路径
     * @param original_filename 原始文件名
     * @param mime_type MIME类型
     * @return UploadResult 上传结果
     */
    UploadResult saveUploadedFile(const std::string& temp_file_path, 
                                 const std::string& original_filename,
                                 const std::string& mime_type);
    
    /**
     * @brief 根据文件ID获取文件路径
     * @param file_id 文件ID
     * @return std::string 文件路径，失败返回空字符串
     */
    std::string getFilePath(const std::string& file_id);
    
    /**
     * @brief 根据文件ID获取文件信息
     * @param file_id 文件ID
     * @param file_info 输出文件信息
     * @return bool 获取是否成功
     */
    bool getFileInfo(const std::string& file_id, FileInfo& file_info);
    
    /**
     * @brief 删除文件（物理删除）
     * @param file_id 文件ID
     * @return bool 删除是否成功
     */
    bool deleteFile(const std::string& file_id);
    
    /**
     * @brief 检查文件是否存在
     * @param file_id 文件ID
     * @return bool 文件是否存在
     */
    bool fileExists(const std::string& file_id);
    
    /**
     * @brief 更新文件下载计数
     * @param file_id 文件ID
     * @return bool 更新是否成功
     */
    bool updateDownloadCount(const std::string& file_id);
    
    /**
     * @brief 清理临时文件
     * @param max_age_hours 文件最大保留时间（小时）
     * @return int 清理的文件数量
     */
    int cleanupTempFiles(int max_age_hours = 24);

private:
    StorageManager() = default;
    ~StorageManager();
    
    // 禁用拷贝构造和赋值操作
    StorageManager(const StorageManager&) = delete;
    StorageManager& operator=(const StorageManager&) = delete;
    
    /**
     * @brief 根据哈希值生成文件存储路径
     * @param hash 文件哈希值
     * @param extension 文件扩展名
     * @return std::string 存储路径
     */
    std::string generateStoragePath(const std::string& hash, const std::string& extension = "");
    
    /**
     * @brief 移动文件到最终存储位置
     * @param temp_path 临时文件路径
     * @param storage_path 存储路径
     * @return bool 移动是否成功
     */
    bool moveToStorage(const std::string& temp_path, const std::string& storage_path);
    
    /**
     * @brief 从文件名提取扩展名
     * @param filename 文件名
     * @return std::string 扩展名（包含点号）
     */
    std::string getFileExtension(const std::string& filename);
    
    /**
     * @brief 获取当前时间戳字符串
     * @return std::string ISO格式的时间戳
     */
    std::string getCurrentTimestamp();

private:
    std::mutex mutex_;  ///< 线程安全锁
    bool initialized_ = false;  ///< 是否已初始化
}; 